package com.kirk.crawler.utils;


import org.apache.commons.io.IOUtils;

import java.io.*;
import java.util.List;

/**
 *  <p> FileUtils.java </p>
 *
 * @Author      kirkliu
 * @Date        2020-08-29 22:32
 * @version     1.0.0
 * @Description 文件操作类
 */
public class FileUtils {

    /**
     * 检查文件是否存在
     */
    public static boolean checkFileIsexists(String path){
        File file = new File(path);
        if (file.exists()) {
            return true;
        }
        return false;
    }

    /**
     * 得到指定目录下系统指定类型的所有文件
     *
     */
    public static void getAllFiles(File dir, List<File> fileList) {
        File files[] = null;
        files = dir.listFiles();
        // 如果文件是目录，那么继续找出目录下的文件
        if (null != files)
            for (int i = 0; i < files.length; i++) {
                if (files[i].isDirectory()) {
                    getAllFiles(files[i], fileList);
                } else {
                    fileList.add(files[i]);
                }
            }

    }

    /**
     * 创建文件
     * <p>
     * 不存在则创建
     *
     * @param newFilePath
     *            文件夹路径
     */
    public static void createFile(String newFilePath) throws IOException {
        File file = new File(newFilePath);
        if (!file.exists()) {
            file.createNewFile();
        }
    }

    /**
     * 将文件创建在指定路径下
     *
     * @param file
     *            原文件
     * @param newFilePath
     *            保存路径
     * @param append
     *            如果存在是否追加
     * @return 错误信息，默认为空
     */
    public static boolean createFile(File file, String newFilePath,boolean append) {
        InputStream in = null;
        FileOutputStream out = null;
        try {
            in = new FileInputStream(file);
            byte[] bs = IOUtils.toByteArray(in);
            File newFile = new File(newFilePath);
            if(newFile.exists()){
                newFile.delete();
            }
            out = new FileOutputStream(newFile, append);
            // 拷贝数据到新文件
            IOUtils.write(bs, out);
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        } finally {
            if (null != in) {
                try {
                    in.close();
                    in = null;
                } catch (IOException e) {
                    e.printStackTrace();
                    return false;
                }
            }
            if (null != out) {
                try {
                    out.close();
                    out = null;
                } catch (IOException e) {
                    e.printStackTrace();
                    return false;
                }
            }
        }
        return true;
    }

    /**
     * 删除文件
     *
     * @param filePath
     *            文件路径
     * @return true/false true 成功
     */
    public static void deleteFile(String filePath) {
        File file = new File(filePath);
        if(file.exists()){
            file.delete();
        }
    }

    /**
     * 删除文件
     * @param filePath 文件路径
     * @param deleteParentDirOnEmpty 当父目录为空时是否删除目录
     */
    public static void deleteFile(String filePath,boolean deleteParentDirOnEmpty) {
        File file = new File(filePath);
        if(file.exists()){
            file.delete();
        }
        if(deleteParentDirOnEmpty ){
            File[] files = file.getParentFile().listFiles();
            if(null == files || files.length == 0){
                file.getParentFile().delete();
            }
        }
    }

    /**
     * 删除所有文件
     */
    public static void deleteAllFile(String filePath){
        File file = new File(filePath);
        if (file.isFile()) {
            file.delete();
        } else {
            File[] fileList = file.listFiles();
            if(null != fileList && fileList.length > 0){
                for (File f : fileList) {
                    deleteAllFile(f.getAbsolutePath());
                }
            }
            file.delete();
        }
    }
}
